--[[ 
这时候就要有人问了，哎呀，这技能是什么来着？翻译表给我写哪去了？
别担心，这里有贴心的技能描述注释在这里了：
自若：转换技，锁定技，当你使用，阳：最左侧的手牌时，你摸一张牌；阴：最右侧的手牌时，你摸一张牌。当你本回合发动过自若后，你本回合不可以调整手牌。
当然，我是不会说真正的翻译是在packages\huixiangkill\pkg\hxqunyou\init.lua的第685行的。
好啦，不串了，下面严肃一点吧~
--]]
local hx__ziruo = fk.CreateSkill{
  name = "hx__ziruo",
  tags = { Skill.Switch, Skill.Compulsory },  --这一行内容会在什么时候被学习到什么程度的人看到呢？我也不太清楚。但作为注释，索性还是解释一下吧：这里是表明了该技能是转换技，同时也是锁定技。
}


hx__ziruo:addLoseEffect(function (self, player, is_death)  --如果你正在使用VS Code的话，ctrl+单机这个addLoseEffect即可查看到它的功能，你就会看到：失去此技能时，触发此函数
  player.room:unbanSortingHandcards(player, "-_hx__ziruo-turn") --也就是说，该技能还有一个隐藏效果，那就是失去此技能时“解禁排序手牌”。至于为什么要这样，且看：
end)

hx__ziruo:addEffect(fk.CardUsing, {  --使用牌时触发技能，写技能嘛，时机一定要写对
  anim_type = "drawcard",  --特效该效果的特效当然是drawcard，摸牌特效最合适了。当然了，你愿意的话，改成其他的也没什么问题。
  can_trigger = function(self, event, target, player, data)  --说起来，手搓这一行代码的次数应该不超过3次
    if target == player and player:hasSkill(hx__ziruo.name) and
      data.extra_data and data.extra_data.hx__ziruoSideCards then  --这里则判断此次使用卡牌的data是否有hx__ziruoSideCards，
      if player:getSwitchSkillState(hx__ziruo.name) == fk.SwitchYang then  --有则继续判断当前转换技的状态，如果是阳，那么则判断data.extra_data.hx__ziruoSideCards中的
        return table.contains(Card:getIdList(data.card), data.extra_data.hx__ziruoSideCards[1]) --第一个元素（通过[1]获取到的）是否在Card:getIdList(data.card)中。
      else --else则是player:getSwitchSkillState(hx__ziruo.name) == fk.SwitchYang的取反情况，即转换技是阴状态时，判断data.extra_data.hx__ziruoSideCards中的第2个元素。
        return table.contains(Card:getIdList(data.card), data.extra_data.hx__ziruoSideCards[2]) --那么问题就来了，为什么要判断data.extra_data.hx__ziruoSideCards呢？又为什么判断Card:getIdList(data.card)呢？
      end -- 没错，首先，data.extra_data.hx__ziruoSideCards是一个表，表中存储了两个元素，分别是最左侧的手牌和最右侧的手牌的id，而要想触发技能，则要判断当前的卡牌（即data.card）是不是他们中的之一，那你可能会问，
    end --那为什么不直接用“==”来判断data.extra_data.hx__ziruoSideCards[1]和data.card呢？而是用table.contains来判断其是否在Card:getIdList(data.card)中呢？
  end, -- 没错，因为使用牌的data.card可能不仅仅是一张牌啊，我用丈八蛇矛将最左侧的牌和最右侧的牌一齐当作杀使用，那是不是该必然摸牌呢？显然应该是的，故此处应该使用data.card的id列表，而不是直接简单的对比data.card。
  on_use = function(self, event, target, player, data)  --那么怎么确定的data.extra_data.hx__ziruoSideCards呢？且看 39~51行。
    local room = player.room  --回到这里，当然是先声明一下room是player的room了，方面后面不用每次用room都是player.room（当然也不是非得用room，用room666什么的也是一样的，变量是这样的）
    player:drawCards(1, hx__ziruo.name)  --摸牌的要义，真正意义上的第一个参数是玩家，谁要摸牌，这里当然是player。然后是摸牌数、技能名了。
    if not player.dead and player:getMark(MarkEnum.SortProhibited .. "-_hx__ziruo-turn") == 0 then --来了，技能核心之禁止排序——首先是经典判活，玩家都似了还禁止什么（bushi）；其次是赋予标记！
      room:banSortingHandcards(player, "-_hx__ziruo-turn")  --MarkEnum.SortProhibited，是约定的禁止排序手牌的标记，使用即可，
      --而"-_hx__ziruo-turn"，则是额外的后缀，_hx_ziruo是为了防止标记相同的，万一和其他人一样岂不是乱套了。而-turn的效果，则是让这个标记只存在一个回合！再也不用手动清除标记了~
      --无独有偶，禁两次就没必要了，所以这里是判了一个空，没有禁止排序手牌的标记才能触发关键的禁止排序手牌的效果，当然也是有后缀的。
      --那么是时候解答之前的问题了，为什么要添加失去技能时的效果呢？是的，三国杀的游戏是瞬息万变的，若是你这次发动技能之后技能就没了呢？那还该不该能调整手牌顺序呢？
      --答案是应该是可以的。毕竟，如果没有特地声明是持续的，仅仅是一句“你本回合不可以调整手牌”，我们通常便是要在失去技能时清除残留效果的。诸如曹髦的道心值、乐系列武将的手牌标记等等。
      --那么，注释环节差不多该结束了，下次讲蓄发的时候，可就没那么多笔墨了哦。
    end
  end,
})

hx__ziruo:addEffect(fk.PreCardUse, { --没错，也就是在我们使用卡牌之前，就要先行确定一下手牌顺序
  can_refresh = function (self, event, target, player, data) --can_refresh，无需过多介绍了吧？可以说是艺术一样的函数了，功能与can_trigger类似，而作用则是润物细无声。以我的理解，则是顾名思义，“refresh”，刷新的意思。
    return target == player and player:hasSkill(hx__ziruo.name, true) and not player:isKongcheng()  --什么时候可以“刷新”？用牌者为自己，自己有该技能且忽略技能是否无效，自己不是0手牌
  end,
  on_refresh = function (self, event, target, player, data) --“刷新”了执行什么效果？
    if player:canSortHandcards() then  --如函数所言，判断角色是否可以排序手牌
      player.room:syncPlayerClientCards(player) -- 如果可以，则同步角色的客户端手牌顺序，至于为什么要这样，等你理解客户端与服务端时，便知道了
    end
    local handcards = player:getCardIds("h") --声明handcards是角色的手牌id列表，"h"，代表获得的手牌的id列表，全称是hand。如果是"he"，则会把装备区的牌也算在里面，e，则是equip，装备的缩写。而判定区，那则是j了。
    data.extra_data = data.extra_data or {}  --关键的来了，创建data的extra_data，即额外数据。没错，我们是通过在这个效果先在卡牌的使用过程中添加了extra_data，从而使得在上面的CardUsing时机中用来判断使用的卡牌在手牌中的顺序
    data.extra_data.hx__ziruoSideCards = { handcards[1], handcards[#handcards] } --这里是传给extra_data什么了呢？如果你已经理解了lua中的表，想必也是懂得的。
    -- 没错，这里便是分别将handcards中的第一个元素（也就是我们需要的最左侧手牌！）和最后一个元素（以及最右侧手牌！）赋值给了data.extra_data.hx__ziruoSideCards的第一个元素和第二个元素
    -- 表的妙用，就在其中。
  end,
})

return hx__ziruo
